#include <stm32f10x.h>

#include <led.h>
#include <uart.h>
#include <key.h>
#include <timer.h>
#include <delay.h>
#include <stdio.h>
#include <systick.h>
extern u8 tim3_cap_flag;
extern u32 tim3_cap_value;
extern u32 tim3_update_count;

/*
 * 多任务测试（本来是task10里面的，为了方便调试放到task9中来实现）
 */
void board_init()
{
    systick_init(72);
    // interrupt在uart.c里面指定了中断函数，可以自行处理接收uart数据并输出到控制台的逻辑
    // uart_init(INTERRUPT, UART1, 115200);
    // 改为CHECK（轮询）机制，这样需要main函数中自己来写接收串口数据并进行输出
    // 但是比较复杂，效果还不好；所以实时高速响应能够使用中断尽量使用中断方式
    uart_init(CHECK, UART1, 115200);
    printf("system init is OK!\r\n");
}

int main()
{
    char data[11] = {0};
    int i=0, j = 0;
    board_init();

    while (1)
    {
        if(i == 1000000){
            printf("i am 1s\r\n");
					  i = 0;
        }
        // 如果只是有printf + delay_s + 中断是没有问题的；
        // printf("I am 1s\r\n");
        // delay_s(1);

        // 如果是轮询方式需要自己来实现读取串口数据
        // 只有j =1才是说明有新数据被读取到
        // 第二个参数开始传递参数为10，导致有数据丢失，这个是因为增加了循环的次数导致的
        // 但是其实从应用实现来看完全可以读到一个字符就是通过uart_send_data_quick直接
        // 发送出来，不需要搞循环读，增加了复杂性导致了实时性被影响，进而uart数据丢失
        j = uart_recv_data(data, 1);
        // 注意增加对于j值的判断，因为只有j值返回为1才代表从串口的缓冲区中获取了数据；
        // 如果不加这个判断，接收完毕数据后将会不断的输出接收到的最后一个字符
        if (j)
        {
            // 直接调用原始的uart_recv_data，会发现丢了很多字符串，比如原始字符串“11111qqq”
            // 最终只能接收到11q，这是因为uart_recv_data执行时间比较长，缓冲区溢出了，新来的字符
            // 冲掉了之前的字符，导致有数据丢失现象
            // printf("%s\r\n", data);

            // 增加了\r\n之后，输出的内容反而少了，倒是不带换行符的还能够多输出
            // 可能是因为处理\r\n也是需要时间
            // printf("%c\r\n", data[0]);
            // printf("%c", data[0]);

            // 到此可以相对完整的输出，不过还是会有却一个字符的情况：
            // uart_send_data(UART1, data, j);
            // 采用快速版本
            uart_send_data_quick(data, j);
        }
        delay_us(1);
        i++;
    }
}

int main2(void)
{
    u32 num = 12;
    u32 time_result = 0;
    //    u32 recv_len = 0;
    //    u8 recv_data_buf[10];

    //    int temp = 0;

    led_init();
    key_init(KEY1, INTERRUPT);
    key_init(KEY2, CHECK);

    uart_init(INTERRUPT, UART1, 9600);

    tim_init(TIMER2, INTERRUPT, TIMING, 1999, 35999);
    // TODO arr打满，就是0xFFFF，分频71，频率就是1M
    tim_init(TIMER3, INTERRUPT, CAP, 0xFFFF, 71);
    delay_us(1);
    printf("system init is OK\r\n");
    uart_send_data(UART1, &num, sizeof(num));

    while (1)
    {
#if 1
        if (key_int_flag)
        {
            led_opr(ON);
        }
        else
        {
            led_opr(OFF);
        }

        if (2 == tim3_cap_flag)
        {
            time_result = tim3_update_count * 65535;
            time_result += tim3_cap_value;

            printf("time is %d us\r\n", time_result);
            tim3_cap_flag = 0;
            time_result = 0;
            tim3_update_count = 0;
        }
    }
#endif
    //return 1;
}
